% 接收机环路设计参数配置
% 包含各跟踪环路的滤波器参数、积分时间、阈值等

function Config = configReceiverLoops()
    Config = struct();
    
    %% 接收机通用参数
    Config.receiver = struct();
    % 接收机采样率与发射机是一致的，略(Hz)
    % 接收信号是?个天线的输出得到的,略
    
    %% 跟踪环路通用参数
    Config.tracker = struct();
    Config.tracker.totalIntegTime = 1e-3; % 总积分时间(s)

    %% 1. 非旋转载波成分跟踪环路
    Config.tracker.pll = struct();      % 锁相环配置
    Config.tracker.pll.order = 3;       % 环路阶数
    Config.tracker.pll.noiseBandwidth = 40; % 噪声带宽(Hz)
    Config.tracker.pll.flagBoxCarInteg = false; % 是否使用矩形积分器
    Config.tracker.pll.InitialPhaseOffset = 0; % 初始相位偏移(弧度)
    
    Config.tracker.fll = struct();      % 锁频环配置
    Config.tracker.fll.order = 2;       % 环路阶数
    Config.tracker.fll.noiseBandwidth = 4; % 噪声带宽(Hz)
    Config.tracker.fll.flagBoxCarInteg = false; % 是否使用矩形积分器
    Config.tracker.fll.InitialFreqOffset = 100; % 初始频率偏移(Hz)
    
    %% 2. 旋转载波成分跟踪环路
    % Config.tracker.rotationCarrier = struct();
    % Config.tracker.rotationCarrier.order = 2; % 旋转成分跟踪阶数
    % Config.tracker.rotationCarrier.order = 2; % 旋转成分跟踪阶数  
    % Config.tracker.rotationCarrier.noiseBandwidth = 2; % 噪声带宽(Hz)
    % Config.tracker.rotationCarrier.amplitudeBw = 1; % 幅度跟踪带宽(Hz)
    % Config.tracker.rotationCarrier.phaseDiscType = 'quadrature'; % 相位鉴相器类型
    
    %% 3. 旋转频率跟踪环路
    Config.tracker.rotationFreq = struct();
    Config.tracker.rotationFreq.order = 1; % 旋转频率跟踪阶数
    Config.tracker.rotationFreq.noiseBandwidth = 1; % 噪声带宽(Hz)
    Config.tracker.rotationFreq.flagBoxCarInteg = false; % 是否使用矩形积分器
    Config.tracker.rotationFreq.T_coh = 1e-4; % 以Tcoh为周期的积分-清除时间.需要满足一些条件，
    Config.tracker.rotationFreq.T_roll = 0.5; % 二次积分-清除时间，分辨率必须大于旋转频率
    Config.tracker.rotationFreq.rho = 0.9; % IIR 平滑因子
    Config.tracker.rotationFreq.InitialFreqOffset = 90; % 初始旋转频率偏移(Hz)
    

    %% 4. 多天线合并环路 
    Config.tracker.antennaCombining = struct();
    % Config.tracker.antennaCombining.type = 'maxRatio'; % 合并方式(maxRatio/equalGain)
    % Config.tracker.antennaCombining.adaptive = true; % 是否启用自适应合并
    Config.tracker.antennaCombining.weightUpdateRate = 10; % 权重更新率(Hz)
    
    %% 5. 码跟踪环路(DLL)
    Config.tracker.dll = struct();
    Config.tracker.dll.order = 2;       % DLL阶数
    Config.tracker.dll.noiseBandwidth = 2; % 噪声带宽(Hz)
    Config.tracker.dll.InitialCodePhaseOffset = 0.3; % 初始码相位偏移(码片数)
    Config.tracker.dll.flagBoxCarInteg = false; % 是否使用矩形积分器
    Config.tracker.dll.discriminatorToZero = true; % 鉴码器输出调整为0

    % 器件参数 

    % 1. 频率鉴别器配置
    Config.module.freqDiscriminator = struct();
    Config.module.freqDiscriminator.type = 'atan2'; % 鉴别器类型(New/Naive)
    Config.module.freqDiscriminator.FreqDiscriminatorToZero = true; % 频率鉴别器输出调整为0
    Config.module.freqDiscriminator.PhaseDiscriminatorToZero = false; % 鉴相器输出调整为0
    
    % 2.  锁相检测器参数
    Config.module.pllLockDetector = struct();
    Config.module.pllLockDetector.K1 = 0.0247; % 检测系数1
    Config.module.pllLockDetector.K2 = 1.5; % 检测系数2
    Config.module.pllLockDetector.Lp = 50; % 锁定判定窗口长度
    Config.module.pllLockDetector.Lo = 240; % 失锁判定窗口长度

    % 3. CNDR估计器参数
    Config.module.cndrEstimator = struct();
end